🎖️GitЯра🎖️
src/helpers/sensors/MicroNMEALocationProvider.h 93b2db63de9009af047a2d0e1bcd97b4b0ba7106 (93b2db63) Text, 4.80 KB
Tff7b72#Tff7b72pragma once
Tff7b72#Tff7b72include T8b949e"LocationProvider.h"
Tff7b72#Tff7b72include T8b949e<MicroNMEA.h>
Tff7b72#Tff7b72include T8b949e<RTClib.h>
Tff7b72#Tff7b72include T8b949e<helpers/RefCountedDigitalPin.h>
Tff7b72#Tff7b72ifndef GPS_EN
Tff7b72#Tff7b72ifdef PIN_GPS_EN
Tff7b72#Tff7b72define GPS_EN PIN_GPS_EN
Tff7b72#Tff7b72else
Tff7b72#Tff7b72define GPS_EN (-1)
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72ifndef GPS_EN_ACTIVE
Tff7b72#Tff7b72ifdef PIN_GPS_EN_ACTIVE
Tff7b72#Tff7b72define GPS_EN_ACTIVE PIN_GPS_EN_ACTIVE
Tff7b72#Tff7b72else
Tff7b72#Tff7b72define GPS_EN_ACTIVE HIGH
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72ifndef GPS_RESET
Tff7b72#Tff7b72ifdef PIN_GPS_RESET
Tff7b72#Tff7b72define GPS_RESET PIN_GPS_RESET
Tff7b72#Tff7b72else
Tff7b72#Tff7b72define GPS_RESET (-1)
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72ifndef GPS_RESET_ACTIVE
Tff7b72#Tff7b72ifdef PIN_GPS_RESET_ACTIVE
Tff7b72#Tff7b72define GPS_RESET_ACTIVE PIN_GPS_RESET_ACTIVE
Tff7b72#Tff7b72else
Tff7b72#Tff7b72define GPS_RESET_ACTIVE LOW
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72endif
Te6edf3class Te6edf3MicroNMEALocationProvider Tff7b72: Te6edf3public Te6edf3LocationProvider Tb4b4b4{
Tffa657char Te6edf3_nmeaBufferTb4b4b4[T79c0ff100Tb4b4b4]Tb4b4b4;
Te6edf3MicroNMEA Te6edf3nmeaTb4b4b4;
Te6edf3meshTff7b72:Tff7b72:Te6edf3RTCClockTff7b72* Te6edf3_clockTb4b4b4;
Te6edf3StreamTff7b72* Te6edf3_gps_serialTb4b4b4;
Te6edf3RefCountedDigitalPinTff7b72* Te6edf3_peripher_powerTb4b4b4;
Tffa657int8_t Te6edf3_claims Tff7b72= T79c0ff0Tb4b4b4;
Tffa657int Te6edf3_pin_resetTb4b4b4;
Tffa657int Te6edf3_pin_enTb4b4b4;
Tffa657unsigned Tffa657long Te6edf3next_check Tff7b72= T79c0ff0Tb4b4b4;
Tffa657long Te6edf3time_valid Tff7b72= T79c0ff0Tb4b4b4;
Tffa657unsigned Tffa657long Te6edf3_last_time_sync Tff7b72= T79c0ff0Tb4b4b4;
Tff7b72static Tff7b72const Tffa657unsigned Tffa657long Te6edf3TIME_SYNC_INTERVAL Tff7b72= T79c0ff1800000Tb4b4b4; T8b949e// Re-sync every 30 minutes
Te6edf3public Tff7b72:
Te6edf3MicroNMEALocationProviderTb4b4b4(Te6edf3StreamTff7b72& Te6edf3serTb4b4b4, Te6edf3meshTff7b72:Tff7b72:Te6edf3RTCClockTff7b72* Te6edf3clock Tff7b72= Tffa657NULLTb4b4b4, Tffa657int Te6edf3pin_reset Tff7b72= Te6edf3GPS_RESETTb4b4b4, Tffa657int Te6edf3pin_en Tff7b72= Te6edf3GPS_ENTb4b4b4,Te6edf3RefCountedDigitalPinTff7b72* Te6edf3peripher_powerTff7b72=Tffa657NULLTb4b4b4) Tff7b72:
Te6edf3nmeaTb4b4b4(Te6edf3_nmeaBufferTb4b4b4, Tff7b72sizeofTb4b4b4(Te6edf3_nmeaBufferTb4b4b4)Tb4b4b4)Tb4b4b4, Te6edf3_clockTb4b4b4(Te6edf3clockTb4b4b4)Tb4b4b4, Te6edf3_gps_serialTb4b4b4(Tff7b72&Te6edf3serTb4b4b4)Tb4b4b4, Te6edf3_peripher_powerTb4b4b4(Te6edf3peripher_powerTb4b4b4)Tb4b4b4, Te6edf3_pin_resetTb4b4b4(Te6edf3pin_resetTb4b4b4)Tb4b4b4, Te6edf3_pin_enTb4b4b4(Te6edf3pin_enTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3_pin_reset Tff7b72!Tff7b72= T79c0ff-1Tb4b4b4) Tb4b4b4{
Te6edf3pinModeTb4b4b4(Te6edf3_pin_resetTb4b4b4, Te6edf3OUTPUTTb4b4b4)Tb4b4b4;
Te6edf3digitalWriteTb4b4b4(Te6edf3_pin_resetTb4b4b4, Te6edf3GPS_RESET_ACTIVETb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3_pin_en Tff7b72!Tff7b72= T79c0ff-1Tb4b4b4) Tb4b4b4{
Te6edf3pinModeTb4b4b4(Te6edf3_pin_enTb4b4b4, Te6edf3OUTPUTTb4b4b4)Tb4b4b4;
Te6edf3digitalWriteTb4b4b4(Te6edf3_pin_enTb4b4b4, Tff7b72!Te6edf3GPS_EN_ACTIVETb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tffa657void Te6edf3claimTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3_claimsTff7b72+Tff7b72+Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3_peripher_powerTb4b4b4) Te6edf3_peripher_powerTff7b72-Tff7b72>Te6edf3claimTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tffa657void Te6edf3releaseTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3_claims Tff7b72=Tff7b72= T79c0ff0Tb4b4b4) Tff7b72returnTb4b4b4; T8b949e// avoid negative _claims
Te6edf3_claimsTff7b72-Tff7b72-Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3_peripher_powerTb4b4b4) Te6edf3_peripher_powerTff7b72-Tff7b72>Te6edf3releaseTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tffa657void Te6edf3beginTb4b4b4(Tb4b4b4) Te6edf3override Tb4b4b4{
Te6edf3claimTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3_pin_en Tff7b72!Tff7b72= T79c0ff-1Tb4b4b4) Tb4b4b4{
Te6edf3digitalWriteTb4b4b4(Te6edf3_pin_enTb4b4b4, Te6edf3GPS_EN_ACTIVETb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3_pin_reset Tff7b72!Tff7b72= T79c0ff-1Tb4b4b4) Tb4b4b4{
Te6edf3digitalWriteTb4b4b4(Te6edf3_pin_resetTb4b4b4, Tff7b72!Te6edf3GPS_RESET_ACTIVETb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tffa657void Te6edf3resetTb4b4b4(Tb4b4b4) Te6edf3override Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3_pin_reset Tff7b72!Tff7b72= T79c0ff-1Tb4b4b4) Tb4b4b4{
Te6edf3digitalWriteTb4b4b4(Te6edf3_pin_resetTb4b4b4, Te6edf3GPS_RESET_ACTIVETb4b4b4)Tb4b4b4;
Te6edf3delayTb4b4b4(T79c0ff10Tb4b4b4)Tb4b4b4;
Te6edf3digitalWriteTb4b4b4(Te6edf3_pin_resetTb4b4b4, Tff7b72!Te6edf3GPS_RESET_ACTIVETb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tffa657void Te6edf3stopTb4b4b4(Tb4b4b4) Te6edf3override Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3_pin_en Tff7b72!Tff7b72= T79c0ff-1Tb4b4b4) Tb4b4b4{
Te6edf3digitalWriteTb4b4b4(Te6edf3_pin_enTb4b4b4, Tff7b72!Te6edf3GPS_EN_ACTIVETb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3_pin_reset Tff7b72!Tff7b72= T79c0ff-1Tb4b4b4) Tb4b4b4{
Te6edf3digitalWriteTb4b4b4(Te6edf3_pin_resetTb4b4b4, Te6edf3GPS_RESET_ACTIVETb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3releaseTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tffa657bool Te6edf3isEnabledTb4b4b4(Tb4b4b4) Te6edf3override Tb4b4b4{
T8b949e// directly read the enable pin if present as gps can be
T8b949e// activated/deactivated outside of here ...
Tff7b72if Tb4b4b4(Te6edf3_pin_en Tff7b72!Tff7b72= T79c0ff-1Tb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3digitalReadTb4b4b4(Te6edf3_pin_enTb4b4b4) Tff7b72=Tff7b72= Te6edf3GPS_EN_ACTIVETb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72return Tffa657trueTb4b4b4; T8b949e// no enable so must be active
Tb4b4b4}
Tb4b4b4}
Tffa657void Te6edf3syncTimeTb4b4b4(Tb4b4b4) Te6edf3override Tb4b4b4{ Te6edf3nmeaTb4b4b4.Te6edf3clearTb4b4b4(Tb4b4b4)Tb4b4b4; Te6edf3LocationProviderTff7b72:Tff7b72:Te6edf3syncTimeTb4b4b4(Tb4b4b4)Tb4b4b4; Tb4b4b4}
Tffa657long Te6edf3getLatitudeTb4b4b4(Tb4b4b4) Te6edf3override Tb4b4b4{ Tff7b72return Te6edf3nmeaTb4b4b4.Te6edf3getLatitudeTb4b4b4(Tb4b4b4)Tb4b4b4; Tb4b4b4}
Tffa657long Te6edf3getLongitudeTb4b4b4(Tb4b4b4) Te6edf3override Tb4b4b4{ Tff7b72return Te6edf3nmeaTb4b4b4.Te6edf3getLongitudeTb4b4b4(Tb4b4b4)Tb4b4b4; Tb4b4b4}
Tffa657long Te6edf3getAltitudeTb4b4b4(Tb4b4b4) Te6edf3override Tb4b4b4{
Tffa657long Te6edf3alt Tff7b72= T79c0ff0Tb4b4b4;
Te6edf3nmeaTb4b4b4.Te6edf3getAltitudeTb4b4b4(Te6edf3altTb4b4b4)Tb4b4b4;
Tff7b72return Te6edf3altTb4b4b4;
Tb4b4b4}
Tffa657long Te6edf3satellitesCountTb4b4b4(Tb4b4b4) Te6edf3override Tb4b4b4{ Tff7b72return Te6edf3nmeaTb4b4b4.Te6edf3getNumSatellitesTb4b4b4(Tb4b4b4)Tb4b4b4; Tb4b4b4}
Tffa657bool Te6edf3isValidTb4b4b4(Tb4b4b4) Te6edf3override Tb4b4b4{ Tff7b72return Te6edf3nmeaTb4b4b4.Te6edf3isValidTb4b4b4(Tb4b4b4)Tb4b4b4; Tb4b4b4}
Tffa657long Te6edf3getTimestampTb4b4b4(Tb4b4b4) Te6edf3override Tb4b4b4{
Te6edf3DateTime Td2a8ffdtTb4b4b4(Te6edf3nmeaTb4b4b4.Te6edf3getYearTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3nmeaTb4b4b4.Te6edf3getMonthTb4b4b4(Tb4b4b4)Tb4b4b4,Te6edf3nmeaTb4b4b4.Te6edf3getDayTb4b4b4(Tb4b4b4)Tb4b4b4,Te6edf3nmeaTb4b4b4.Te6edf3getHourTb4b4b4(Tb4b4b4)Tb4b4b4,Te6edf3nmeaTb4b4b4.Te6edf3getMinuteTb4b4b4(Tb4b4b4)Tb4b4b4,Te6edf3nmeaTb4b4b4.Te6edf3getSecondTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72return Te6edf3dtTb4b4b4.Te6edf3unixtimeTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tffa657void Te6edf3sendSentenceTb4b4b4(Tff7b72const Tffa657char Tff7b72*Te6edf3sentenceTb4b4b4) Te6edf3override Tb4b4b4{
Te6edf3nmeaTb4b4b4.Te6edf3sendSentenceTb4b4b4(Tff7b72*Te6edf3_gps_serialTb4b4b4, Te6edf3sentenceTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tffa657void Te6edf3loopTb4b4b4(Tb4b4b4) Te6edf3override Tb4b4b4{
Tff7b72while Tb4b4b4(Te6edf3_gps_serialTff7b72-Tff7b72>Te6edf3availableTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tffa657char Te6edf3c Tff7b72= Te6edf3_gps_serialTff7b72-Tff7b72>Te6edf3readTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72ifdef GPS_NMEA_DEBUG
Te6edf3SerialTb4b4b4.Te6edf3printTb4b4b4(Te6edf3cTb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72endif
Te6edf3nmeaTb4b4b4.Te6edf3processTb4b4b4(Te6edf3cTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3isValidTb4b4b4(Tb4b4b4)Tb4b4b4) Te6edf3time_valid Tff7b72= T79c0ff0Tb4b4b4;
Tff7b72if Tb4b4b4(Tb4b4b4(Tffa657longTb4b4b4)Tb4b4b4(Te6edf3millisTb4b4b4(Tb4b4b4) Tff7b72- Te6edf3next_checkTb4b4b4) Tff7b72> T79c0ff0Tb4b4b4) Tb4b4b4{
Te6edf3next_check Tff7b72= Te6edf3millisTb4b4b4(Tb4b4b4) Tff7b72+ T79c0ff1000Tb4b4b4;
T8b949e// Re-enable time sync periodically when GPS has valid fix
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3_time_sync_needed Tff7b72&Tff7b72& Te6edf3_clock Tff7b72!Tff7b72= Tffa657NULL Tff7b72&Tff7b72& Tb4b4b4(Te6edf3millisTb4b4b4(Tb4b4b4) Tff7b72- Te6edf3_last_time_syncTb4b4b4) Tff7b72> Te6edf3TIME_SYNC_INTERVALTb4b4b4) Tb4b4b4{
Te6edf3_time_sync_needed Tff7b72= Tffa657trueTb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3_time_sync_needed Tff7b72&Tff7b72& Te6edf3time_valid Tff7b72> T79c0ff2Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3_clock Tff7b72!Tff7b72= Tffa657NULLTb4b4b4) Tb4b4b4{
Te6edf3_clockTff7b72-Tff7b72>Te6edf3setCurrentTimeTb4b4b4(Te6edf3getTimestampTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3_time_sync_needed Tff7b72= Tffa657falseTb4b4b4;
Te6edf3_last_time_sync Tff7b72= Te6edf3millisTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3isValidTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3time_valid Tff7b72+Tff7b72+Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}Tb4b4b4;
Served by rngit 1.5.2 - Generated in 0.05s